package com.hancai.web;

import com.github.pagehelper.PageInfo;
import com.hancai.model.TUser;
import com.hancai.query.UserQuery;
import com.hancai.result.R;
import com.hancai.service.UserService;
import jakarta.annotation.Resource;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;

/**
 * 1，传递三个请求参数(loginAct,loginPwd,rememberMe)请求登录=>2,springSecurity
 * 接收参数（只接收用户名和密码），调用service层=》3，调用mapper层=》4，查询数据库=》5，查询成功=》
 * 6，构建UserDetails对象返回给spring security=》7，触发handler，handler生成
 * JWT写入redis,设置不同过期时间返回jwt给前端=》8，返回登录结果
 *
 * 1，vue前端请求获取登录数据 /api/login/info =》2,请求头携带token（axios拦截器）=》
 * 3，后端filter验证token，验证未通过就用axios拦截器提示用户跳转登录页=》
 * 4，springSecurity处理=》5，controller层处理=》6，service层处理=》7，mapper处理
 *
 * @author super
 */
@RestController
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/api/login/info")
    public R loginInfo(Authentication authentication){
        TUser tUser=(TUser) authentication.getPrincipal();
        return R.OK(tUser);
    }

    @GetMapping("/api/login/free")
    public R freeLogin(){
        return R.OK();
    }

    /**用于将 HTTP 请求中的查询参数或表单参数绑定到控制器方法的参数上。
     * 用户列表分页查询
     * @param current
     * @return
     */
    @GetMapping(value="/api/users")
    public R userPage(@RequestParam(value = "current",required = false)Integer current){
        if(current==null){
            current=1;
        }
        PageInfo<TUser> pageInfo = userService.getUserByPage(current);
         return R.OK(pageInfo);
    }

    @GetMapping(value = "/api/user/{id}")
    public R userDetail(@PathVariable(value = "id")Integer id){
        TUser tUser=userService.getUserById(id);
        return R.OK(tUser);
    }

    /**
     * 新增用户
     * @param userQuery
     * @return
     */
    @PostMapping(value="/api/user")
    public R addUser(UserQuery userQuery,@RequestHeader(value = "Authorization")String token){
        //把前端请求头的token放入userQuery里面
        userQuery.setToken(token);
        int save=userService.saveUser(userQuery);
        return save>=1 ? R.OK() : R.FAIL();
    }

    /**
     * 编辑用户
     * @param userQuery
     * @return
     */
    @PutMapping(value="/api/user")
    public R editUser(UserQuery userQuery,@RequestHeader(value = "Authorization")String token){
        //把前端请求头的token放入userQuery里面
        userQuery.setToken(token);
        int update=userService.updateUser(userQuery);
        return update>=1 ? R.OK() : R.FAIL();
    }
    @DeleteMapping(value = "/api/user/{id}")
    public R delUser(@PathVariable(value="id")Integer id){
        int del=userService.delUserById(id);
        return del>=1 ? R.OK() : R.FAIL();
    }

    /**
     * split 方法的作用是将一个字符串按照指定的分隔符（这里是逗号 ,）
     * 拆分成多个子字符串，并将这些子字符串存储到一个数组中返回。
     * 从"1,2,3,4,5"=》["1", "2", "3", "4"]
     * @param ids  ids="1,2,3,4,5";
     * @return
     */
    @DeleteMapping(value = "/api/user")
    public R batchDelUser(@RequestParam(value="ids")String ids){
        List<String>idList= Arrays.asList(ids.split(","));
        int batchDel=userService.batchDelUserIds(idList);
        return batchDel>=idList.size() ? R.OK() : R.FAIL();
    }


}
